home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DTP
/
DTP_TEX
/
H067.ZIP
/
JIS2MF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-04-14
|
38KB
|
997 lines
/* -mt -f -A -K -G -O -w */
/* Compile with Turbo-C 2.0 */
/*
This program generates METAFONT code from a Bitmaps file JIS24
Author: Francois Jalbert
'
Date: November 1990
Version: 1.0
Date: April 1991
Version: 2.00
Modifications: - Added four kanjis.
- Fixed incorrect VGA resolution.
- Command line parameter now supported.
- Added automatic mode.
- Added batch mode.
- Updated and improved run-time messages.
- Long triangles added by Mr. Masatoshi Watanabe. Fantastic!
- Fixed and proportional parameters added.
- Standard and dictionary parameters added.
- JIS24 now accessed through low-level I/O channel for speed.
Error Levels: 0 - Normal termination.
1 - Error.
2 - All fonts generated (batch).
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef __TURBOC__
#include <process.h>
#endif
#define True 1
#define False 0
/* Number of Bitmaps in JIS24 */
#define BitmapMax 7806
/* Size of each square Bitmap */
#define SizeMax 24
#define SizeMax1 25
/* DOS file name length */
#define FileNameDOS 250 /* includes path */
#define TotalNameDOS 254
/* DOS Record Size */
#define RecSize 72 /* SizeMax*SizeMax/8 */
/* Parameter flag */
#define Flag1 '/' /* DOS style */
#define Flag2 '-' /* UNIX style */
/* Parameter keywords */
#define ParamMax 20
char FixedX1[]="FIXEDWIDTH";
char FixedX2[]="FIXEDX";
char FixedX3[]="NOPROPORTIONALWIDTH";
char FixedX4[]="NOPROPORTIONALX";
char NoFixedX1[]="NOFIXEDWIDTH";
char NoFixedX2[]="NOFIXEDX";
char NoFixedX3[]="PROPORTIONALWIDTH";
char NoFixedX4[]="PROPORTIONALX";
char FixedY1[]="FIXEDHEIGHT";
char FixedY2[]="FIXEDY";
char FixedY3[]="NOPROPORTIONALHEIGHT";
char FixedY4[]="NOPROPORTIONALY";
char NoFixedY1[]="NOFIXEDHEIGHT";
char NoFixedY2[]="NOFIXEDY";
char NoFixedY3[]="PROPORTIONALHEIGHT";
char NoFixedY4[]="PROPORTIONALY";
char Standard1[]="STANDARD";
char NoStandard1[]="DICTIONARY";
char Batch1[]="BATCH";
/* Answer maximum length */
#define AnswerMax 254
typedef char FileNameType[FileNameDOS+1];
typedef char TotalNameType[TotalNameDOS+1];
typedef char ParamType[ParamMax+1];
typedef char AnswerType[AnswerMax+1];
/* Buffer for the Bitmap Data */
struct ColumnType {
unsigned char Data1,Data2,Data3;
};
typedef struct ColumnType BufferType[SizeMax]; /* start at 0 because of fread */
/* The Bitmap array is defined larger to simplify the forthcoming code */
typedef int BitmapType[SizeMax1+1][SizeMax1+1];
struct BitmapsType {
BitmapType Bitmap;
int XMin,XMax,YMin,YMax;
};
/* Run time parameters */
struct RunTimeType {
FileNameType FileName;
/* Batch mode */
int Batch;
/* Automatic mode for JemTeX fonts only */
int Automatic;
/* Fixed or proportional fonts */
int FixedX,FixedY;
/* Standard or dictionary fonts */
int Standard;
};
void Delete(char *String, int Length)
/* Delete the first Length characters of String */
{
int Index;
Index=0;
do String[Index]=String[Index+Length];
while (String[++Index]!='\0');
}
/*------------------------------- GetParameters -----------------------------*/
void SimpleQuery(char Title[], char ChoiceA[], char ChoiceB[], int *Answer)
{
char JChar[2];
int Valid;
do {
Valid=True;
printf("%s:\n",Title);
printf(" a) %s\n",ChoiceA);
printf(" b) %s\n",ChoiceB);
printf("Your choice? ");
if (ferror(stdout)) exit(1);
if (gets(JChar)==NULL) exit(1);
if (strlen(JChar)>1) exit(1);
JChar[0]=toupper(JChar[0]);
if (JChar[0]=='A') *Answer=True;
else
if (JChar[0]=='B') *Answer=False;
else {
Valid=False;
if (putchar('\7')==EOF) exit(1);
}
} while (!Valid);
printf("\n");
if (ferror(stdout)) exit(1);
}
void GetMode(struct RunTimeType *RunTime)
/* Determines if the desired font is a JemTeX font */
{
RunTime->Automatic=False;
if (toupper(RunTime->FileName[0])=='K')
if (toupper(RunTime->FileName[1])=='A')
if (toupper(RunTime->FileName[2])=='N')
if (toupper(RunTime->FileName[3])=='J')
if (toupper(RunTime->FileName[4])=='I')
if(('A'<=toupper(RunTime->FileName[5]))&&(toupper(RunTime->FileName[5])<='H'))
if(('A'<=toupper(RunTime->FileName[6]))&&(toupper(RunTime->FileName[6])<='H'))
if (strlen(RunTime->FileName)==7)
if (toupper(RunTime->FileName[5])<='G') RunTime->Automatic=True;
else
if (toupper(RunTime->FileName[6])<='E') RunTime->Automatic=True;
}
void EchoParameters(struct RunTimeType *RunTime)
/* Echoes the current parameters */
{
printf("Font=%s",RunTime->FileName);
if (RunTime->FixedX) printf(" Fixed Width");
else printf(" Prop. Width");
if (RunTime->FixedY) printf(" Fixed Height");
else printf(" Prop. Height");
if (RunTime->Standard) printf(" Standard");
else printf(" Dictionary");
if (RunTime->Automatic) printf(" Automatic");
else printf(" Manual");
if (RunTime->Batch) printf(" Batch");
printf(".\n");
if (ferror(stdout)) exit(1);
}
void Manual(struct RunTimeType *RunTime)
/* Get parameters from user */
{
printf("METAFONT file name? ");
if (ferror(stdout)) exit(1);
if (gets(RunTime->FileName)==NULL) exit(1);
if (strlen(RunTime->FileName)>FileNameDOS) {
/* File name too long */
printf("\7File name too long: %s...",RunTime->FileName);
exit(1);
}
printf("\n");
if (ferror(stdout)) exit(1);
SimpleQuery("Fixed or proportional font width","Fixed","Proportional",
&RunTime->FixedX);
SimpleQuery("Fixed or proportional font height","Fixed","Proportional",
&RunTime->FixedY);
SimpleQuery("Standard or dictionary font","Standard","Dictionary",
&RunTime->Standard);
/* Batch mode intrinsically isn't manual */
RunTime->Batch=False;
}
void FindBefore(FileNameType FileName)
/* No check for before kanjiaa */
{
if (FileName[6]=='a') {
FileName[6]='h';
FileName[5]--;
}
else
FileName[6]--;
}
void FindAfter(FileNameType FileName)
/* No check for above kanjihe */
{
if (FileName[6]=='h') {
FileName[6]='a';
FileName[5]++;
}
else
FileName[6]++;
}
void ScanMF(FileNameType FileName)
/* Scans backwards for the last JemTeX font generated */
/* Looks first for a .TFM and then for an .MF */
/* If no more fonts to generate, stops with error level 2 */
{
FILE *TestFile;
TotalNameType TotalName;
int Found;
strcpy(FileName,"kanjihf");
do {
FindBefore(FileName);
strcpy(TotalName,FileName);
strcat(TotalName,".tfm");
TestFile=fopen(TotalName,"r");
Found=(TestFile!=NULL);
if (!Found) {
strcpy(TotalName,FileName);
strcat(TotalName,".mf");
TestFile=fopen(TotalName,"r");
Found=(TestFile!=NULL);
}
} while (!Found && strcmp(FileName,"kanjiaa"));
if (Found) {
if (fclose(TestFile)==EOF) exit(1);
if (strcmp(FileName,"kanjihe")) FindAfter(FileName);
else {
printf("\7All JemTeX fonts generated!\n");
exit(2);
}
}
}
void Automate(struct RunTimeType *RunTime, int argc, char *argv[])
/* Get parameters from command line */
/* Finds the next font to be generated if in batch mode */
{
int ParamIndex,ParamLength,Index;
ParamType Param;
/* Defaults */
strcpy(RunTime->FileName,"kanjiaa");
RunTime->FixedX=False;
RunTime->FixedY=False;
RunTime->Standard=True;
RunTime->Batch=False;
/* Scan command line parameters */
/* 0th is program's name, last is NULL */
for (ParamIndex=1 ; ParamIndex<argc ; ParamIndex++) {
ParamLength=strlen(argv[ParamIndex]);
if (ParamLength>ParamMax) {
/* Keyword too long */
printf("\7Invalid command line parameter: %s...",argv[ParamIndex]);
exit(1);
}
strcpy(Param,argv[ParamIndex]);
if ((Param[0]==Flag1) || (Param[0]==Flag2)) {
/* Not a font name */
/* Delete 1 char at the 1st position */
Delete(Param,1);
/* Convert to upper case */
for (Index=0 ; Index<ParamLength ; Index++)
Param[Index]=toupper(Param[Index]);
/* Scan known keywords */
if ((!strcmp(Param,FixedX1)) || (!strcmp(Param,FixedX2)) ||
(!strcmp(Param,FixedX3)) || (!strcmp(Param,FixedX4)))
RunTime->FixedX=True;
else
if ((!strcmp(Param,NoFixedX1)) || (!strcmp(Param,NoFixedX2)) ||
(!strcmp(Param,NoFixedX3)) || (!strcmp(Param,NoFixedX4)))
RunTime->FixedX=False;
else
if ((!strcmp(Param,FixedY1)) || (!strcmp(Param,FixedY2)) ||
(!strcmp(Param,FixedY3)) || (!strcmp(Param,FixedY4)))
RunTime->FixedY=True;
else
if ((!strcmp(Param,NoFixedY1)) || (!strcmp(Param,NoFixedY2)) ||
(!strcmp(Param,NoFixedY3)) || (!strcmp(Param,NoFixedY4)))
RunTime->FixedY=False;
else
if (!strcmp(Param,Standard1))
RunTime->Standard=True;
else
if (!strcmp(Param,NoStandard1))
RunTime->Standard=False;
else
if (!strcmp(Param,Batch1))
RunTime->Batch=True;
else {
/* Unknown keyword */
printf("\7Invalid command line parameter: %s...\n",Param);
exit(1);
}
}
else {
/* Must be a font name */
if (ParamLength>FileNameDOS) {
/* File name too long */
printf("\7File name too long: %s...\n",Param);
exit(1);
}
strcpy(RunTime->FileName,Param);
}
}
if (RunTime->Batch) ScanMF(RunTime->FileName);
}
void GetParameters(struct RunTimeType *RunTime, int argc, char *argv[])
/* Get parameters from user or command line */
{
/* 0th is program's name, last is NULL */
if (argc==1) Manual(RunTime);
else Automate(RunTime,argc,argv);
GetMode(RunTime);
EchoParameters(RunTime);
printf("\n");
if (ferror(stdout)) exit(1);
}
/*---------------------------------- Output ---------------------------------*/
void BeginOut(FILE *OutFile, struct RunTimeType *RunTime)
/* Writes initial METAFONT header */
/* Co-author is Mr. Masatoshi Watanabe */
{
fprintf(OutFile,"%%JIS2MF Version 2.00 of 14 April 1991.\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"%% Font=%s\n",RunTime->FileName);
if (RunTime->FixedX) fprintf(OutFile,"%% Fixed Width\n");
else fprintf(OutFile,"%% Proportional Width\n");
if (RunTime->FixedY) fprintf(OutFile,"%% Fixed Height\n");
else fprintf(OutFile,"%% Proportional Height\n");
if (RunTime->Standard) fprintf(OutFile,"%% Standard Positioning\n");
else fprintf(OutFile,"%% Dictionary Positioning\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"tracingstats:=1;\n");
fprintf(OutFile,"screen_cols:=640; %%VGA\n");
fprintf(OutFile,"screen_rows:=480; %%VGA\n");
fprintf(OutFile,"font_size 10pt#;\n");
if (RunTime->Standard) {
fprintf(OutFile,"u#:=12.7/36pt#;\n");
fprintf(OutFile,"body_height#:=23.25u#;\n");
fprintf(OutFile,"desc_depth#:=4.75u#;\n");
}
else {
fprintf(OutFile,"u#:=13/36pt#;\n");
fprintf(OutFile,"body_height#:=21u#;\n");
fprintf(OutFile,"desc_depth#:=7u#;\n");
}
fprintf(OutFile,"\n");
fprintf(OutFile,"letter_fit#:=0pt#;\n");
fprintf(OutFile,"asc_height#:=0pt#;\n");
fprintf(OutFile,"cap_height#:=0pt#;\n");
fprintf(OutFile,"fig_height#:=0pt#;\n");
fprintf(OutFile,"x_height#:=0pt#;\n");
fprintf(OutFile,"math_axis#:=0pt#;\n");
fprintf(OutFile,"bar_height#:=0pt#;\n");
fprintf(OutFile,"comma_depth#:=0pt#;\n");
fprintf(OutFile,"crisp#:=0pt#;\n");
fprintf(OutFile,"tiny#:=0pt#;\n");
fprintf(OutFile,"fine#:=0pt#;\n");
fprintf(OutFile,"thin_join#:=0pt#;\n");
fprintf(OutFile,"hair#:=1pt#;\n");
fprintf(OutFile,"stem#:=1pt#;\n");
fprintf(OutFile,"curve#:=1pt#;\n");
fprintf(OutFile,"flare#:=1pt#;\n");
fprintf(OutFile,"dot_size#:=0pt#;\n");
fprintf(OutFile,"cap_hair#:=1pt#;\n");
fprintf(OutFile,"cap_stem#:=1pt#;\n");
fprintf(OutFile,"cap_curve#:=1pt#;\n");
fprintf(OutFile,"rule_thickness#:=0pt#;\n");
fprintf(OutFile,"vair#:=0pt#;\n");
fprintf(OutFile,"notch_cut#:=0pt#;\n");
fprintf(OutFile,"bar#:=1pt#;\n");
fprintf(OutFile,"slab#:=1pt#;\n");
fprintf(OutFile,"cap_bar#:=1pt#;\n");
fprintf(OutFile,"cap_band#:=1pt#;\n");
fprintf(OutFile,"cap_notch_cut#:=0pt#;\n");
fprintf(OutFile,"serif_drop#:=0pt#;\n");
fprintf(OutFile,"stem_corr#:=0pt#;\n");
fprintf(OutFile,"vair_corr#:=0pt#;\n");
fprintf(OutFile,"o#:=0pt#;\n");
fprintf(OutFile,"apex_o#:=0pt#;\n");
fprintf(OutFile,"hefty:=true;\n");
fprintf(OutFile,"serifs:=true;\n");
fprintf(OutFile,"monospace:=false;\n");
fprintf(OutFile,"math_fitting:=false;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"mode_setup;\n");
fprintf(OutFile,"font_setup;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"pair z;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def s(expr col,row)= %%square\n");
fprintf(OutFile," z:=((col*u),(row*u));\n");
fprintf(OutFile," fill unitsquare scaled u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def sul(expr col,row)= %%upper left square\n");
fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def sur(expr col,row)= %%upper right square\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def sbr(expr col,row)= %%bottom right square\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def sbl(expr col,row)= %%bottom left square\n");
fprintf(OutFile," z:=((col*u),(row*u));\n");
fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def c(expr col,row)= %%circle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill fullcircle scaled u shifted z;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def cul(expr col,row)= %%upper left circle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--quartercircle rotated 90 scaled u shifted z--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def cur(expr col,row)= %%upper right circle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--quartercircle scaled u shifted z--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def cbr(expr col,row)= %%bottom right circle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--quartercircle rotated 270 scaled u shifted z--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def cbl(expr col,row)= %%bottom left circle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--quartercircle rotated 180 scaled u shifted z--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def tul(expr col,row)= %%upper left triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tur(expr col,row)= %%upper right triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbr(expr col,row)= %%bottom right triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbl(expr col,row)= %%bottom left triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def rul(expr col,row)= %%upper left reverse triangle\n");
fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rur(expr col,row)= %%upper right reverse triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbr(expr col,row)= %%bottom right reverse triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbl(expr col,row)= %%bottom left reverse triangle\n");
fprintf(OutFile," z:=((col*u),(row*u));\n");
fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def tuul(expr col,row)= %%upper left long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tull(expr col,row)= %%upper left long triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tuur(expr col,row)= %%upper right long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def turr(expr col,row)= %%upper right long triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbbr(expr col,row)= %%bottom right long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbrr(expr col,row)= %%bottom right long triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbbl(expr col,row)= %%bottom left long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def tbll(expr col,row)= %%bottom left long triangle\n");
fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
fprintf(OutFile,"def ruul(expr col,row)= %%upper left reverse long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rull(expr col,row)= %%upper left reverse long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def ruur(expr col,row)= %%upper right reverse long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rurr(expr col,row)= %%upper right reverse long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbbr(expr col,row)= %%bottom right reverse long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbrr(expr col,row)= %%bottom right reverse long triangle\n");
fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbbl(expr col,row)= %%bottom left reverse long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u));\n");
fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"def rbll(expr col,row)= %%bottom left reverse long triangle\n");
fprintf(OutFile," z:=((col*u),(row*u));\n");
fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n");
fprintf(OutFile,"enddef;\n");
fprintf(OutFile,"\n");
if (ferror(OutFile)) exit(1);
}
void ActiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX,
float YY)
/* Writes METAFONT code for an active cell */
/* Co-author is Mr. Masatoshi Watanabe */
{
int SquareUR,SquareUL,SquareBR,SquareBL;
int CircleUR,CircleUL,CircleBR,CircleBL;
int LTryUUR,LTryURR,LTryUUL,LTryULL;
int LTryBBR,LTryBRR,LTryBBL,LTryBLL;
SquareUL=(Bitmap[X-1][Y] || Bitmap[X-1][Y+1] || Bitmap[X][Y+1]);
SquareUR=(Bitmap[X+1][Y] || Bitmap[X+1][Y+1] || Bitmap[X][Y+1]);
SquareBL=(Bitmap[X-1][Y] || Bitmap[X-1][Y-1] || Bitmap[X][Y-1]);
SquareBR=(Bitmap[X+1][Y] || Bitmap[X+1][Y-1] || Bitmap[X][Y-1]);
CircleUL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
!Bitmap[X][Y+1] && !Bitmap[X+1][Y+1]);
CircleUR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
!Bitmap[X][Y+1] && !Bitmap[X-1][Y+1]);
CircleBL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
!Bitmap[X][Y-1] && !Bitmap[X+1][Y-1]);
CircleBR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
!Bitmap[X][Y-1] && !Bitmap[X-1][Y-1]);
LTryUUL=(Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
!Bitmap[X][Y+1] && !Bitmap[X+1][Y+1] && Bitmap[X+1][Y]);
LTryUUR=(Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
!Bitmap[X][Y+1] && !Bitmap[X-1][Y+1] && Bitmap[X-1][Y]);
LTryBBL=(Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
!Bitmap[X][Y-1] && !Bitmap[X+1][Y-1] && Bitmap[X+1][Y]);
LTryBBR=(Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
!Bitmap[X][Y-1] && !Bitmap[X-1][Y-1] && Bitmap[X-1][Y]);
LTryULL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
!Bitmap[X][Y+1] && Bitmap[X+1][Y+1] && Bitmap[X][Y-1]);
LTryURR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
!Bitmap[X][Y+1] && Bitmap[X-1][Y+1] && Bitmap[X][Y-1]);
LTryBLL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
!Bitmap[X][Y-1] && Bitmap[X+1][Y-1] && Bitmap[X][Y+1]);
LTryBRR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
!Bitmap[X][Y-1] && Bitmap[X-1][Y-1] && Bitmap[X][Y+1]);
if (LTryUUL) fprintf(OutFile,"tuul(%d,%4.2f);",XX,YY);
if (LTryULL) fprintf(OutFile,"tull(%d,%4.2f);",XX,YY);
if (LTryUUR) fprintf(OutFile,"tuur(%d,%4.2f);",XX,YY);
if (LTryURR) fprintf(OutFile,"turr(%d,%4.2f);",XX,YY);
if (LTryBBL) fprintf(OutFile,"tbbl(%d,%4.2f);",XX,YY);
if (LTryBLL) fprintf(OutFile,"tbll(%d,%4.2f);",XX,YY);
if (LTryBBR) fprintf(OutFile,"tbbr(%d,%4.2f);",XX,YY);
if (LTryBRR) fprintf(OutFile,"tbrr(%d,%4.2f);",XX,YY);
if (SquareUL && SquareUR && SquareBL && SquareBR)
fprintf(OutFile,"s(%d,%4.2f);",XX,YY);
else
if (CircleUL && CircleUR && CircleBL && CircleBR)
fprintf(OutFile,"c(%d,%4.2f);",XX,YY);
else {
if (!LTryUUL && !LTryULL && !LTryUUR && !LTryBLL)
if (SquareUL) fprintf(OutFile,"sul(%d,%4.2f);",XX,YY);
else
if (CircleUL) fprintf(OutFile,"cul(%d,%4.2f);",XX,YY);
else fprintf(OutFile,"tul(%d,%4.2f);",XX,YY);
if (!LTryUUL && !LTryURR && !LTryUUR && !LTryBRR)
if (SquareUR) fprintf(OutFile,"sur(%d,%4.2f);",XX,YY);
else
if (CircleUR) fprintf(OutFile,"cur(%d,%4.2f);",XX,YY);
else fprintf(OutFile,"tur(%d,%4.2f);",XX,YY);
if (!LTryBBL && !LTryULL && !LTryBBR && !LTryBLL)
if (SquareBL) fprintf(OutFile,"sbl(%d,%4.2f);",XX,YY);
else
if (CircleBL) fprintf(OutFile,"cbl(%d,%4.2f);",XX,YY);
else fprintf(OutFile,"tbl(%d,%4.2f);",XX,YY);
if (!LTryBBL && !LTryURR && !LTryBBR && !LTryBRR)
if (SquareBR) fprintf(OutFile,"sbr(%d,%4.2f);",XX,YY);
else
if (CircleBR) fprintf(OutFile,"cbr(%d,%4.2f);",XX,YY);
else fprintf(OutFile,"tbr(%d,%4.2f);",XX,YY);
}
if (ferror(OutFile)) exit(1);
}
void InactiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX,
float YY, int *Active)
/* Writes METAFONT code for an inactive cell */
/* Co-author is Mr. Masatoshi Watanabe */
{
if (Bitmap[X-1][Y] && Bitmap[X][Y+1])
if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1])
{ *Active=True; fprintf(OutFile,"ruul(%d,%4.2f);",XX,YY); }
else
if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1])
{ *Active=True; fprintf(OutFile,"rull(%d,%4.2f);",XX,YY); }
else
{ *Active=True; fprintf(OutFile,"rul(%d,%4.2f);",XX,YY); }
if (Bitmap[X+1][Y] && Bitmap[X][Y+1])
if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1])
{ *Active=True; fprintf(OutFile,"ruur(%d,%4.2f);",XX,YY); }
else
if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1])
{ *Active=True; fprintf(OutFile,"rurr(%d,%4.2f);",XX,YY); }
else
{ *Active=True; fprintf(OutFile,"rur(%d,%4.2f);",XX,YY); }
if (Bitmap[X-1][Y] && Bitmap[X][Y-1])
if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1])
{ *Active=True; fprintf(OutFile,"rbbl(%d,%4.2f);",XX,YY); }
else
if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1])
{ *Active=True; fprintf(OutFile,"rbll(%d,%4.2f);",XX,YY); }
else
{ *Active=True; fprintf(OutFile,"rbl(%d,%4.2f);",XX,YY); }
if (Bitmap[X+1][Y] && Bitmap[X][Y-1])
if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1])
{ *Active=True; fprintf(OutFile,"rbbr(%d,%4.2f);",XX,YY); }
else
if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1])
{ *Active=True; fprintf(OutFile,"rbrr(%d,%4.2f);",XX,YY); }
else
{ *Active=True; fprintf(OutFile,"rbr(%d,%4.2f);",XX,YY); }
if (ferror(OutFile)) exit(1);
}
void MiddleOut(FILE *OutFile, struct BitmapsType *Bitmaps, int Number,
int Standard)
/* Writes METAFONT code for a given Bitmap */
{
int X,Y;
int Active;
fprintf(OutFile,"beginchar(%d,%du#,",Number,Bitmaps->XMax-Bitmaps->XMin+1);
if (Standard) {
if (Bitmaps->YMax>0.75) fprintf(OutFile,"%4.2fu#,",Bitmaps->YMax-0.75);
else fprintf(OutFile,"0,");
if (5.75>Bitmaps->YMin) fprintf(OutFile,"%4.2fu#);\n",5.75-Bitmaps->YMin);
else fprintf(OutFile,"0);\n");
}
else {
if (Bitmaps->YMax>3) fprintf(OutFile,"%du#,",Bitmaps->YMax-3);
else fprintf(OutFile,"0,");
if (8>Bitmaps->YMin) fprintf(OutFile,"%du#);\n",8-Bitmaps->YMin);
else fprintf(OutFile,"0);\n");
}
fprintf(OutFile,"normal_adjust_fit(2u#,2u#);\n");
for (X=Bitmaps->XMin ; X<=Bitmaps->XMax ; X++)
for (Y=1 ; Y<=SizeMax ; Y++) {
Active=Bitmaps->Bitmap[X][Y];
if (Active)
/* Current pixel is on */
if (Standard)
ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75);
else
ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6);
else
/* Current pixel is off */
if (Standard)
InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75,
&Active);
else
InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6,
&Active);
/* Avoid METAFONT buffer overflow */
if (Active) fprintf(OutFile,"\n");
}
fprintf(OutFile,"endchar;\n");
fprintf(OutFile,"\n");
if (ferror(OutFile)) exit(1);
}
void EndOut(FILE *OutFile, struct RunTimeType *RunTime)
/* Writes final METAFONT header */
{
fprintf(OutFile,"font_identifier \"%s\";\n",RunTime->FileName);
if (RunTime->Standard)
fprintf(OutFile,"font_coding_scheme \"JemTeX Standard\";\n");
else
fprintf(OutFile,"font_coding_scheme \"JemTeX Dictionary\";\n");
fprintf(OutFile,"font_slant slant;\n");
fprintf(OutFile,"font_normal_space 8u#;\n");
fprintf(OutFile,"font_normal_stretch 4u#;\n");
fprintf(OutFile,"font_normal_shrink 3u#;\n");
fprintf(OutFile,"font_x_height 24u#; %%ex\n");
fprintf(OutFile,"font_quad 24u#; %%em\n");
fprintf(OutFile,"font_extra_space 0u#;\n");
fprintf(OutFile,"\n");
/* Must end with CR/LF because of a bug(?) in emTeX METAFONT */
fprintf(OutFile,"bye\n");
if (ferror(OutFile)) exit(1);
}
/*--------------------------------- Generate --------------------------------*/
void FindWantedBitmap(int Automatic, int *First, int *WantedBitmap, int *Number)
/* Finds number of the next desired Bitmap either automatically or manually */
/* The characters 0 and 1 in the first font kanjiaa are both set to Bitmap 1 */
{
int Valid;
AnswerType Answer;
if (Automatic)
/* Find automatically */
if (*First)
/* Early in font kanjiaa */
if (*WantedBitmap==-1) *WantedBitmap=1;
else {
*WantedBitmap=1;
*First=False;
}
else
if ( (*Number==128) || (*WantedBitmap==BitmapMax) ) *WantedBitmap=0;
else (*WantedBitmap)++;
else
/* Find manually */
do {
printf("Bitmap number? ");
if (ferror(stdout)) exit(1);
if (gets(Answer)==NULL) exit(1);
if (1!=sscanf(Answer,"%d",WantedBitmap)) exit(1);
Valid=( (0<=*WantedBitmap) && (*WantedBitmap<=BitmapMax) );
if (!Valid) {
printf("\7Bitmap %d out of range...\n",*WantedBitmap);
if (ferror(stdout)) exit(1);
}
} while (!Valid);
printf("Bitmap number %d.\n",*WantedBitmap);
if (ferror(stdout)) exit(1);
}
void ScanBitmap(FILE *InFile, BitmapType Bitmap, int *Empty)
/* Reads the Bitmap in a logical grid */
/* (0,0) is the lower left corner of the Bitmap */
{
int Y;
BufferType Buffer;
struct ColumnType *Column;
/* Read the Bitmap */
if (fread(Buffer,(unsigned)RecSize,1U,InFile)!=1U) exit(1);
/* Find if the Bitmap is empty */
*Empty=True;
for (Y=1 ; Y<=SizeMax ; Y++) {
Column=&Buffer[Y-1];
if ( (Column->Data1!=(unsigned char)'\x00') ||
(Column->Data2!=(unsigned char)'\x00') ||
(Column->Data3!=(unsigned char)'\x00') ) {
*Empty=False;
break;
}
}
/* Update logical grid */
if (!*Empty)
for (Y=1 ; Y<=SizeMax ; Y++) {
Column=&Buffer[SizeMax-Y];
Bitmap[ 1][Y]=(int)(Column->Data1 & (unsigned char)'\x80');
Bitmap[ 2][Y]=(int)(Column->Data1 & (unsigned char)'\x40');
Bitmap[ 3][Y]=(int)(Column->Data1 & (unsigned char)'\x20');
Bitmap[ 4][Y]=(int)(Column->Data1 & (unsigned char)'\x10');
Bitmap[ 5][Y]=(int)(Column->Data1 & (unsigned char)'\x08');
Bitmap[ 6][Y]=(int)(Column->Data1 & (unsigned char)'\x04');
Bitmap[ 7][Y]=(int)(Column->Data1 & (unsigned char)'\x02');
Bitmap[ 8][Y]=(int)(Column->Data1 & (unsigned char)'\x01');
Bitmap[ 9][Y]=(int)(Column->Data2 & (unsigned char)'\x80');
Bitmap[10][Y]=(int)(Column->Data2 & (unsigned char)'\x40');
Bitmap[11][Y]=(int)(Column->Data2 & (unsigned char)'\x20');
Bitmap[12][Y]=(int)(Column->Data2 & (unsigned char)'\x10');
Bitmap[13][Y]=(int)(Column->Data2 & (unsigned char)'\x08');
Bitmap[14][Y]=(int)(Column->Data2 & (unsigned char)'\x04');
Bitmap[15][Y]=(int)(Column->Data2 & (unsigned char)'\x02');
Bitmap[16][Y]=(int)(Column->Data2 & (unsigned char)'\x01');
Bitmap[17][Y]=(int)(Column->Data3 & (unsigned char)'\x80');
Bitmap[18][Y]=(int)(Column->Data3 & (unsigned char)'\x40');
Bitmap[19][Y]=(int)(Column->Data3 & (unsigned char)'\x20');
Bitmap[20][Y]=(int)(Column->Data3 & (unsigned char)'\x10');
Bitmap[21][Y]=(int)(Column->Data3 & (unsigned char)'\x08');
Bitmap[22][Y]=(int)(Column->Data3 & (unsigned char)'\x04');
Bitmap[23][Y]=(int)(Column->Data3 & (unsigned char)'\x02');
Bitmap[24][Y]=(int)(Column->Data3 & (unsigned char)'\x01');
}
}
void ScanSides(struct BitmapsType *Bitmaps, int FixedX, int FixedY)
/* Determines the minimal size of the Bitmap for proportional spacing */
{
int X,Y;
if (FixedX) {
Bitmaps->XMin=1;
Bitmaps->XMax=SizeMax;
}
else {
Bitmaps->XMin=SizeMax1;
for (X=SizeMax ; X>=1 ; X--)
for (Y=1 ; Y<=SizeMax ; Y++)
if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMin=X;
Bitmaps->XMax=0;
for (X=1 ; X<=SizeMax ; X++)
for (Y=1 ; Y<=SizeMax ; Y++)
if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMax=X;
}
if (FixedY) {
Bitmaps->YMin=1;
Bitmaps->YMax=SizeMax;
}
else {
Bitmaps->YMin=SizeMax1;
for (Y=SizeMax ; Y>=1 ; Y--)
for (X=1 ; X<=SizeMax ; X++)
if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMin=Y;
Bitmaps->YMax=0;
for (Y=1 ; Y<=SizeMax ; Y++)
for (X=1 ; X<=SizeMax ; X++)
if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMax=Y;
}
}
void Generate(FILE *InFile, FILE *OutFile, int *Number,
struct RunTimeType *RunTime)
/* Generates the METAFONT code for the selected font */
{
/* Bitmap pointers */
int CurrentBitmap,WantedBitmap;
/* Current Bitmap and its dimensions */
struct BitmapsType Bitmaps;
int X,Y;
/* Indicates early in font kanjiaa */
int First;
/* Indicates current Bitmap is empty */
int Empty;
/* Clear the area outside the Bitmap once and for all */
for (X=0 ; X<=SizeMax1 ; X++) {
Bitmaps.Bitmap[X][0]=False; Bitmaps.Bitmap[X][SizeMax1]=False; }
for (Y=1 ; Y<=SizeMax ; Y++) {
Bitmaps.Bitmap[0][Y]=False; Bitmaps.Bitmap[SizeMax1][Y]=False; }
/* Number of the Bitmap ready to be read */
CurrentBitmap=1;
/* First METAFONT character number */
*Number=0;
/* First Bitmap wanted */
if (RunTime->Automatic) {
WantedBitmap=1024 * ( toupper(RunTime->FileName[5])-'A' ) +
128 * ( toupper(RunTime->FileName[6])-'A' ) - 1;
First=(WantedBitmap==-1);
}
do {
FindWantedBitmap(RunTime->Automatic,&First,&WantedBitmap,Number);
if (WantedBitmap) {
/* Position pointer */
if (WantedBitmap!=CurrentBitmap) {
if ( fseek(InFile , ((WantedBitmap-1L)*RecSize) , 0) ) exit(1);
CurrentBitmap=WantedBitmap;
}
printf("Reading Bitmap");
if (ferror(stdout)) exit(1);
ScanBitmap(InFile,Bitmaps.Bitmap,&Empty);
CurrentBitmap++;
printf(".\n");
if (ferror(stdout)) exit(1);
/* Process Bitmap */
if (Empty) printf("Bitmap is empty, no METAFONT code %d.\n",*Number);
else {
printf("Writing METAFONT code %d",*Number);
ScanSides(&Bitmaps,RunTime->FixedX,RunTime->FixedY);
MiddleOut(OutFile,&Bitmaps,*Number,RunTime->Standard);
printf(".\n");
}
printf("\n");
if (ferror(stdout)) exit(1);
/* Ready to generate next METAFONT character */
(*Number)++;
}
} while (WantedBitmap);
}
/*----------------------------------- Main ----------------------------------*/
main(int argc, char *argv[])
{
/* JIS24 and METAFONT file names */
FILE *InFile;
FILE *OutFile;
TotalNameType TotalName;
/* Current METAFONT character number */
int Number;
/* Run time parameters */
struct RunTimeType RunTime;
printf("\n");
printf("Bitmaps to METAFONT Conversion Program.\n"); /*To make Borland happy*/
printf("Version 2.00 Copyright F. Jalbert 1991.\n");
printf("\n");
if (ferror(stdout)) exit(1);
printf("Opening Bitmap file JIS24");
InFile=fopen("jis24","rb");
if (InFile==NULL) exit(1);
printf(".\n");
printf("\n");
if (ferror(stdout)) exit(1);
GetParameters(&RunTime,argc,argv);
strcpy(TotalName,RunTime.FileName);
strcat(TotalName,".mf");
printf("Creating METAFONT file %s",TotalName);
OutFile=fopen(TotalName,"wt");
if (OutFile==NULL) exit(1);
printf(".\n");
printf("\n");
if (ferror(stdout)) exit(1);
printf("Writing initial METAFONT header");
#ifndef __TURBOC__
printf("\n");
#endif
BeginOut(OutFile,&RunTime);
printf(".\n");
printf("\n");
Generate(InFile,OutFile,&Number,&RunTime);
printf("\n");
if (ferror(stdout)) exit(1);
printf("Writing final METAFONT header");
#ifndef __TURBOC__
printf("\n");
#endif
EndOut(OutFile,&RunTime);
printf(".\n");
printf("Closing METAFONT file %s",TotalName);
if (fclose(OutFile)==EOF) exit(1);
printf(".\n");
printf("Closing Bitmap file JIS24");
if (fclose(InFile)==EOF) exit(1);
printf(".\n");
printf("\n");
if (ferror(stdout)) exit(1);
printf("METAFONT code for %d Bitmap(s) generated.\n",Number);
printf("\n");
if (ferror(stdout)) exit(1);
return(0);
}